package com.syg.rabbitmq.producer;


import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 *
 * <img width="" height="" src="../../../../../resources/picture/work_queue模式.png" alt="work模式默认交换机">
 *     <br/>
 *     两个消费者是竞争关系，也就是说同一条消息只会发给其中一个消费者
 *     <br/>
 *     2，工作队列模式（work模式）：
 *     和简单队列模式一样，不过有一点不同，该模式有多个消费者在监听队列。
 *     RabbitMQ会以轮询的方式将消息发给多个消费者确保一条消息只会被一个消费者消费
 *     <br/>
 *     ###也就是说该模式与simple模式的代码是一致的,只是多个消费者而已(消费者消费的时候指定队列)《==》simple模式是work模式的一种特殊体现。
 */
public class Work_Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1,创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        //2,设置参数  设定连接信息，基操
        factory.setHost("127.0.0.1");
        factory.setPort(5672);  //注意这里写5672，是amqp协议端口
        factory.setUsername("guest");
        factory.setPassword("guest");
        // 为什么这里声明虚拟主机会报错呢？
        factory.setVirtualHost("/");

        // 3,创建连接
        Connection connection = factory.newConnection();
        // 4,创建Channel
        Channel channel = connection.createChannel();

        // 5,创建队列，如果此队列不存在，会自动创建
        /*
                queue:队列名称
                durable:是否持久化,当mq重启之后还在。
                exclusive：是否独占。只能有一个消费者监听这个队列。当connection关闭时,是否删除
                autoDelete：知否自动删除，当没有消费者监听时,删除
         */
        // 如果没有yyds的队列,则会创建一个队列，如果存在则不创建。
        channel.queueDeclare("work_queue", true, false, false, null);

        // 6,发送消息
        /*
            exchange：交换机名称，work模式默认的交换机是""
            routingKey:路由名称。work模式，路由名称与队列名称一致(强一致，不一致的话发送不到mq服务器中)
            props:配置信息
            body:发送消息
         */
        for (int i = 0; i < 10; i++) {
            String str = i + "_work";
            channel.basicPublish("", "work_queue", null, str.getBytes());

        }

        // 7，关闭资源。如果不关闭会一直开着
        channel.close();
        connection.close();
    }
}
